RMI Callback Mechanism হলো এমন একটি প্রক্রিয়া যেখানে একটি সার্ভার ক্লায়েন্টের অনুরোধে একটি নির্দিষ্ট ইভেন্ট বা তথ্য সরবরাহ করার জন্য ক্লায়েন্টে একটি মেথড কল করে। এটি bidirectional communication সক্ষম করে, যেখানে ক্লায়েন্ট এবং সার্ভার উভয়ই একে অপরকে মেথড কল করতে পারে।
RMI Callback ব্যবহৃত হয় এমন ক্ষেত্রে যেখানে ক্লায়েন্ট সার্ভারের কাছ থেকে রিয়েল-টাইম ইভেন্টের নোটিফিকেশন চায়।
import java.rmi.Remote;
import java.rmi.RemoteException;
// Remote Interface for Callback
public interface CallbackClient extends Remote {
void notifyEvent(String message) throws RemoteException;
}
import java.rmi.server.UnicastRemoteObject;
import java.rmi.RemoteException;
// Client-Side Callback Implementation
public class CallbackClientImpl extends UnicastRemoteObject implements CallbackClient {
public CallbackClientImpl() throws RemoteException {
super();
}
@Override
public void notifyEvent(String message) throws RemoteException {
System.out.println("Notification from Server: " + message);
}
}
import java.rmi.Remote;
import java.rmi.RemoteException;
// Remote Interface for Server
public interface Server extends Remote {
void registerCallback(CallbackClient client) throws RemoteException;
void triggerEvent() throws RemoteException;
}
import java.rmi.server.UnicastRemoteObject;
import java.rmi.RemoteException;
import java.util.ArrayList;
import java.util.List;
// Server Implementation
public class ServerImpl extends UnicastRemoteObject implements Server {
private List<CallbackClient> clients;
public ServerImpl() throws RemoteException {
super();
clients = new ArrayList<>();
}
@Override
public void registerCallback(CallbackClient client) throws RemoteException {
clients.add(client);
System.out.println("Client registered for callback.");
}
@Override
public void triggerEvent() throws RemoteException {
for (CallbackClient client : clients) {
client.notifyEvent("This is a callback message from the server.");
}
}
}
import java.rmi.registry.LocateRegistry;
import java.rmi.registry.Registry;
public class ServerApp {
public static void main(String[] args) {
try {
// Create and export the server object
ServerImpl server = new ServerImpl();
// Start RMI Registry
Registry registry = LocateRegistry.createRegistry(1099);
// Bind the server object to the RMI Registry
registry.bind("Server", server);
System.out.println("Server is running...");
} catch (Exception e) {
e.printStackTrace();
}
}
}
import java.rmi.registry.LocateRegistry;
import java.rmi.registry.Registry;
public class ClientApp {
public static void main(String[] args) {
try {
// Locate the RMI Registry
Registry registry = LocateRegistry.getRegistry("localhost", 1099);
// Lookup the server object
Server server = (Server) registry.lookup("Server");
// Create a callback client
CallbackClientImpl client = new CallbackClientImpl();
// Register the client for callback
server.registerCallback(client);
// Trigger an event from the server
server.triggerEvent();
} catch (Exception e) {
e.printStackTrace();
}
}
}
কম্পাইল করা:
javac *.java
RMI Registry চালানো:
rmiregistry 1099
Server চালানো:
java ServerApp
Client চালানো:
java ClientApp
RemoteException
পরিচালনা করতে হয়।RMI Callback Mechanism ক্লায়েন্ট-সার্ভার যোগাযোগের একটি কার্যকর উপায়, যা সার্ভার থেকে ক্লায়েন্টে ইভেন্টের তথ্য প্রেরণ করতে সক্ষম করে। উদাহরণটি দেখায় কীভাবে একটি Callback মডেল তৈরি এবং পরিচালনা করা যায়, যা জটিল Distributed Systems ডিজাইন করার ক্ষেত্রে গুরুত্বপূর্ণ।
RMI Callback হল এমন একটি প্রক্রিয়া যেখানে RMI সার্ভার রিমোট ক্লায়েন্টকে তার মেথড কলব্যাক করে। অর্থাৎ, ক্লায়েন্ট শুধুমাত্র সার্ভারকে মেথড কল করে না, বরং সার্ভারও প্রয়োজন অনুসারে ক্লায়েন্টের মেথড কল করতে পারে। এটি Bi-Directional Communication নিশ্চিত করে।
RMI Callback মূলত Event-Driven Architecture এবং Client Notification এর জন্য ব্যবহৃত হয়। উদাহরণস্বরূপ, চ্যাট সিস্টেম, স্টক আপডেট, বা রিয়েল-টাইম নোটিফিকেশন সিস্টেমে এটি ব্যবহার করা হয়।
import java.rmi.Remote;
import java.rmi.RemoteException;
// Client Remote Interface
public interface ClientCallback extends Remote {
void notifyClient(String message) throws RemoteException;
}
import java.rmi.Remote;
import java.rmi.RemoteException;
// Server Remote Interface
public interface Server extends Remote {
void registerClient(ClientCallback client) throws RemoteException;
void broadcastMessage(String message) throws RemoteException;
}
import java.rmi.RemoteException;
import java.rmi.server.UnicastRemoteObject;
// Client Callback Implementation
public class ClientCallbackImpl extends UnicastRemoteObject implements ClientCallback {
protected ClientCallbackImpl() throws RemoteException {
super();
}
@Override
public void notifyClient(String message) throws RemoteException {
System.out.println("Notification from Server: " + message);
}
}
import java.rmi.RemoteException;
import java.rmi.server.UnicastRemoteObject;
import java.util.ArrayList;
import java.util.List;
// Server Implementation
public class ServerImpl extends UnicastRemoteObject implements Server {
private final List<ClientCallback> clients;
protected ServerImpl() throws RemoteException {
super();
clients = new ArrayList<>();
}
@Override
public void registerClient(ClientCallback client) throws RemoteException {
clients.add(client);
System.out.println("Client registered successfully!");
}
@Override
public void broadcastMessage(String message) throws RemoteException {
for (ClientCallback client : clients) {
client.notifyClient(message); // Call client callback method
}
}
}
import java.rmi.Naming;
import java.rmi.registry.LocateRegistry;
public class ServerApp {
public static void main(String[] args) {
try {
LocateRegistry.createRegistry(1099); // RMI Registry শুরু করা
ServerImpl server = new ServerImpl();
Naming.rebind("rmi://localhost:1099/ServerService", server);
System.out.println("Server is running...");
} catch (Exception e) {
e.printStackTrace();
}
}
}
import java.rmi.Naming;
public class ClientApp {
public static void main(String[] args) {
try {
// Create and register client callback
ClientCallback clientCallback = new ClientCallbackImpl();
// Look up the server object
Server server = (Server) Naming.lookup("rmi://localhost:1099/ServerService");
// Register the client with the server
server.registerClient(clientCallback);
// Broadcast a message
server.broadcastMessage("Hello, Clients!");
} catch (Exception e) {
e.printStackTrace();
}
}
}
RMI Callback জাভা RMI প্রযুক্তির একটি শক্তিশালী ফিচার যা ক্লায়েন্ট এবং সার্ভারের মধ্যে Two-Way Communication সম্ভব করে। এটি বাস্তবায়নের মাধ্যমে ইভেন্ট-ড্রিভেন আর্কিটেকচার, রিয়েল-টাইম নোটিফিকেশন সিস্টেম, এবং অন্যান্য ইন্টারঅ্যাক্টিভ অ্যাপ্লিকেশন তৈরি করা যায়। সঠিকভাবে পরিকল্পনা এবং বাস্তবায়নের মাধ্যমে RMI Callback একটি কার্যকর টুল হতে পারে।
Java RMI (Remote Method Invocation) এর মাধ্যমে ক্লায়েন্ট অ্যাপ্লিকেশন সার্ভার সাইডে থাকা রিমোট মেথড কল করতে পারে। এটি একটি ডিস্ট্রিবিউটেড আর্কিটেকচার তৈরি করে যেখানে রিমোট অবজেক্ট মেথড ইন্টারঅ্যাকশন সম্ভব হয়।
Remote মেথডের সংজ্ঞা Remote Interface-এ থাকে। এটি অবশ্যই java.rmi.Remote ইন্টারফেসটি এক্সটেন্ড করতে হবে এবং প্রতিটি মেথডে RemoteException থ্রো করতে হবে।
import java.rmi.Remote;
import java.rmi.RemoteException;
public interface MyRemoteService extends Remote {
String sayHello(String name) throws RemoteException;
}
Remote Object হলো Remote Interface এর ইমপ্লিমেন্টেশন। এটি UnicastRemoteObject এক্সটেন্ড করে এবং রিমোট মেথডগুলোর লজিক সরবরাহ করে।
import java.rmi.server.UnicastRemoteObject;
import java.rmi.RemoteException;
public class MyRemoteServiceImpl extends UnicastRemoteObject implements MyRemoteService {
public MyRemoteServiceImpl() throws RemoteException {
super();
}
@Override
public String sayHello(String name) throws RemoteException {
return "Hello, " + name + "! Welcome to RMI.";
}
}
RMI Server Remote Object তৈরি করে এবং এটি RMI Registry তে নিবন্ধন করে।
import java.rmi.registry.LocateRegistry;
import java.rmi.registry.Registry;
public class RMIServer {
public static void main(String[] args) {
try {
// Remote Object তৈরি করা
MyRemoteServiceImpl service = new MyRemoteServiceImpl();
// RMI Registry তৈরি করা
Registry registry = LocateRegistry.createRegistry(1099);
// Remote Object কে RMI Registry তে bind করা
registry.bind("MyService", service);
System.out.println("RMI Server is running...");
} catch (Exception e) {
e.printStackTrace();
}
}
}
RMI Client RMI Registry থেকে রিমোট অবজেক্ট খুঁজে পায় এবং রিমোট মেথড কল করে।
import java.rmi.registry.LocateRegistry;
import java.rmi.registry.Registry;
public class RMIClient {
public static void main(String[] args) {
try {
// RMI Registry থেকে রিমোট অবজেক্ট খোঁজা
Registry registry = LocateRegistry.getRegistry("localhost", 1099);
MyRemoteService service = (MyRemoteService) registry.lookup("MyService");
// রিমোট মেথড কল করা
String response = service.sayHello("Alice");
System.out.println("Server Response: " + response);
} catch (Exception e) {
e.printStackTrace();
}
}
}
RMI Server is running...
Server Response: Hello, Alice! Welcome to RMI.
RMI Registry:
RMI Registry চালু করতে হবে।
rmiregistry
Java RMI ব্যবহার করে ক্লায়েন্ট অ্যাপ্লিকেশন সহজেই রিমোট সার্ভারে মেথড কল করতে পারে। RMI যোগাযোগের মাধ্যমে ডিস্ট্রিবিউটেড সিস্টেম তৈরির জন্য এটি একটি শক্তিশালী টুল। Stub, RMI Registry, এবং Serialization এর মতো উপাদানগুলি সঠিকভাবে কনফিগার করে এই প্রক্রিয়া সফলভাবে সম্পন্ন করা যায়।
Java RMI সাধারণত ক্লায়েন্ট-টু-সার্ভার যোগাযোগে ব্যবহৃত হয়। তবে RMI Callback পদ্ধতি ব্যবহার করে ক্লায়েন্ট এবং সার্ভারের মধ্যে দুই-দিকের (two-way) যোগাযোগ নিশ্চিত করা যায়। এই পদ্ধতিতে, ক্লায়েন্ট একটি Remote Object সার্ভারের কাছে নিবন্ধিত করে এবং সার্ভার প্রয়োজন অনুযায়ী ক্লায়েন্টকে কলব্যাক করে।
RMI Callback এমন একটি প্রক্রিয়া যেখানে:
এই পদ্ধতি Two-Way Communication বা Bidirectional Communication এর জন্য ব্যবহৃত হয়।
একটি Remote Interface তৈরি করা হয় যা সার্ভার ক্লায়েন্টের Remote Object এ কল করার জন্য ব্যবহার করবে।
import java.rmi.Remote;
import java.rmi.RemoteException;
// Callback Interface
public interface CallbackClientInterface extends Remote {
void notifyClient(String message) throws RemoteException;
}
এটি সার্ভিসের জন্য ব্যবহৃত হবে, যেখানে ক্লায়েন্ট নিজের Remote Object রেজিস্টার করবে।
import java.rmi.Remote;
import java.rmi.RemoteException;
// Server Service Interface
public interface ServerServiceInterface extends Remote {
void registerClient(CallbackClientInterface client) throws RemoteException;
void sendMessage(String message) throws RemoteException;
}
সার্ভার ক্লায়েন্টদের রেজিস্টার করে এবং তাদের Callback মেথড কল করে।
import java.rmi.server.UnicastRemoteObject;
import java.rmi.RemoteException;
import java.util.ArrayList;
import java.util.List;
// Server Implementation
public class ServerServiceImpl extends UnicastRemoteObject implements ServerServiceInterface {
private final List<CallbackClientInterface> clients;
public ServerServiceImpl() throws RemoteException {
super();
clients = new ArrayList<>();
}
@Override
public void registerClient(CallbackClientInterface client) throws RemoteException {
clients.add(client);
System.out.println("Client registered.");
}
@Override
public void sendMessage(String message) throws RemoteException {
System.out.println("Sending message to clients...");
for (CallbackClientInterface client : clients) {
client.notifyClient(message);
}
}
}
ক্লায়েন্ট নিজের Remote Object ইমপ্লিমেন্ট করে এবং সার্ভারে রেজিস্টার করে।
Callback Client Implementation:
import java.rmi.server.UnicastRemoteObject;
import java.rmi.RemoteException;
// Client Callback Implementation
public class CallbackClientImpl extends UnicastRemoteObject implements CallbackClientInterface {
public CallbackClientImpl() throws RemoteException {
super();
}
@Override
public void notifyClient(String message) throws RemoteException {
System.out.println("Message from Server: " + message);
}
}
Client Main Class:
import java.rmi.Naming;
public class RMIClient {
public static void main(String[] args) {
try {
// RMI Registry থেকে Server Object খুঁজে বের করা
ServerServiceInterface server = (ServerServiceInterface) Naming.lookup("rmi://localhost:1099/ServerService");
// Callback Object তৈরি এবং রেজিস্ট্রেশন
CallbackClientInterface client = new CallbackClientImpl();
server.registerClient(client);
// সার্ভারে মেসেজ পাঠানোর অনুরোধ
server.sendMessage("Hello from Client!");
} catch (Exception e) {
e.printStackTrace();
}
}
}
RMI Registry-তে সার্ভার অবজেক্ট রেজিস্টার করা হয়।
import java.rmi.Naming;
public class RMIServer {
public static void main(String[] args) {
try {
// Server Implementation তৈরি এবং RMI Registry-তে রেজিস্ট্রেশন
ServerServiceInterface server = new ServerServiceImpl();
Naming.rebind("rmi://localhost:1099/ServerService", server);
System.out.println("Server is running...");
} catch (Exception e) {
e.printStackTrace();
}
}
}
Java RMI Callback একটি শক্তিশালী পদ্ধতি যা RMI-তে Two-Way Communication এর জন্য ব্যবহৃত হয়। এটি রিয়েল-টাইম অ্যাপ্লিকেশন যেমন চ্যাট সিস্টেম, ইভেন্ট নোটিফিকেশন ইত্যাদিতে অত্যন্ত কার্যকর। সঠিক কনফিগারেশন এবং নিরাপত্তার মাধ্যমে RMI Callback পদ্ধতি ব্যবহার করা নিরাপদ ও কার্যকর।
RMI Callback এমন একটি পদ্ধতি, যেখানে সার্ভার একটি ক্লায়েন্টে ফিরে কল করতে পারে। এটি সাধারণত এমন পরিস্থিতিতে ব্যবহৃত হয় যেখানে ক্লায়েন্ট কোনো কাজ শুরু করে এবং সার্ভার সেই কাজের ফলাফল ক্লায়েন্টকে জানায়। RMI Callback সিস্টেমে ক্লায়েন্টকে Remote Object হিসেবে নিবন্ধন করতে হয় যাতে সার্ভার সেটিকে কল করতে পারে।
import java.rmi.Remote;
import java.rmi.RemoteException;
public interface Callback extends Remote {
void notifyClient(String message) throws RemoteException;
}
import java.rmi.Remote;
import java.rmi.RemoteException;
public interface Server extends Remote {
void registerCallback(Callback clientCallback) throws RemoteException;
void performTask() throws RemoteException;
}
import java.rmi.server.UnicastRemoteObject;
import java.util.ArrayList;
import java.util.List;
public class ServerImpl extends UnicastRemoteObject implements Server {
private final List<Callback> clients;
protected ServerImpl() throws RemoteException {
super();
clients = new ArrayList<>();
}
@Override
public void registerCallback(Callback clientCallback) throws RemoteException {
clients.add(clientCallback);
System.out.println("Client registered for callback.");
}
@Override
public void performTask() throws RemoteException {
System.out.println("Performing task on the server...");
// Task complete, notify clients
for (Callback client : clients) {
client.notifyClient("Task completed successfully!");
}
}
}
import java.rmi.server.UnicastRemoteObject;
public class ClientCallbackImpl extends UnicastRemoteObject implements Callback {
protected ClientCallbackImpl() throws RemoteException {
super();
}
@Override
public void notifyClient(String message) throws RemoteException {
System.out.println("Callback received from server: " + message);
}
}
import java.rmi.Naming;
import java.rmi.registry.LocateRegistry;
public class ServerMain {
public static void main(String[] args) {
try {
LocateRegistry.createRegistry(1099);
ServerImpl server = new ServerImpl();
Naming.rebind("rmi://localhost:1099/Server", server);
System.out.println("Server is running...");
} catch (Exception e) {
e.printStackTrace();
}
}
}
import java.rmi.Naming;
public class ClientMain {
public static void main(String[] args) {
try {
// Locate the server
Server server = (Server) Naming.lookup("rmi://localhost:1099/Server");
// Create and register client callback
Callback clientCallback = new ClientCallbackImpl();
server.registerCallback(clientCallback);
// Perform task on the server
server.performTask();
} catch (Exception e) {
e.printStackTrace();
}
}
}
ServerImpl
অবজেক্ট তৈরি করবে এবং RMI Registry-তে নিবন্ধন করবে।registerCallback()
মেথড কল করে সার্ভারে নিজের কলব্যাক রেজিস্টার করবে।notifyClient()
মেথড ব্যবহার করে ক্লায়েন্টে কলব্যাক পাঠাবে।Server is running...
Client registered for callback.
Performing task on the server...
Callback received from server: Task completed successfully!
RMI Callback একটি শক্তিশালী কৌশল, যা ডিস্ট্রিবিউটেড সিস্টেমে দ্বিমুখী যোগাযোগের সুবিধা প্রদান করে। এই পদ্ধতির মাধ্যমে ক্লায়েন্ট এবং সার্ভার তাদের নিজ নিজ কাজ পরিচালনা করতে পারে এবং সার্ভারের ফলাফল ক্লায়েন্টে প্রেরণ করতে পারে।
Read more